/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.controller;

import com.exception.DataException;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import com.javabeans.*;
import com.model.*;
import com.db.*;
import com.util.*;
import java.sql.Connection;
import java.util.ArrayList;
import java.util.List;

/**
 *
 * @author Administrador
 */
public class Inscripciones extends HttpServlet {

    HttpServletRequest request;
    HttpServletResponse response;
    HttpSession session;
    String msg = "";
    
    private String PAGE = "";
    private static final String ERROR_PAGE = "WEB-INF/error.jsp";
    private static final String ERROR_AJAX = "WEB-INF/errorAjax.jsp";
    boolean isForward = true; // inicializamos con forward....
    Estudiante s_Estudiante = null;
    
    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        this.request = request;
        this.response = response;
        session = request.getSession();
        int accion = Integer.parseInt(request.getParameter("accion"));
        if(session.getAttribute("s_estudiante") != null){
            s_Estudiante = (Estudiante)session.getAttribute("s_estudiante");
            try{
                switch(accion){
                    case 1 : indexInscripcion(); break;                         // accion = 1 = me manda al indice de inscripcion
                    case 2 : ofertaMaterias(); break;                           // accion = 2 = oferta de materias
                    case 3 : cerrarSessionEst(request, response); break;        // accion = 3 = cerrar sesion de la inscripcion
                    case 4 : irAestadoDeInscripcion(accion); break;                   // accion = 4 = para ir a estado de inscripcion al momento d inscribirse
                    case 5 : ofertarMateriasDesdeIns(); break;                  // accion = 5 = es para mostrar nuevamente la oferta de materias a partir de la sesion
                    case 6 : irAestadoDeInscripcionDesdeOfer(); break;          // accion = 6 = para ver en las materias q estan inscritas
                    case 7 : estadoDeInscripcionAjax(); break;                  // accion = 7 = el ajax cuando se elimina una materia
                    case 8 : irAestadoDeInscripcion(accion); break;                   // accion = 4 = para ir a estado de inscripcion al momento d inscribirse
                    default : System.out.println(" accion = "+accion+" no existe en Transacciones.java"); throw new DataException("accion = "+accion+" no existe en Transaccion.java");
                }
            }catch(DataException e){
                throw new ServletException(e);
            }
        }else
            PAGE = "web/index.jsp?msg=Indentifiquese. La Session no existe!";
        if(PAGE.length() > 0){
            if(isForward){
                RequestDispatcher dispatch = request.getRequestDispatcher(PAGE);
                dispatch.forward(request,response);
            }else{
                response.sendRedirect(PAGE);
            }
        }
    }
    
    private void indexInscripcion() throws DataException{
        // accion = 1 = me manda al index inscripcion
        Connection c = null;
        try{
            c = Conector.getConexion();
            CarreraManager cmanager = ManagerFactory.getCarreraManagerInstance(c);
            GestionManager gmanager = ManagerFactory.getGestionManagerInstance(c);
            List<Carrera> carrerasActivas = cmanager.getCarrerasPorEst(s_Estudiante.getIdEstudiante());
            request.setAttribute("carrerasActivas", carrerasActivas);
            request.setAttribute("gestiones", gmanager.getGestVigentesYfuturosBasico());
            PAGE = "WEB-INF/ESTUDIANTE/Inscripcion/indexInscripcion.jsp";
        }catch(DataException e){
            System.out.println(UtilDate.getDateTime()+" Administracion -> showHorarios() e: "+e.getMessage());
            request.setAttribute("msgError", UtilDate.getDateTime()+" Administracion -> showHorarios() DataException "+e.getMessage());
            PAGE = ERROR_PAGE;
        }catch(Exception ex){
            System.out.println(UtilDate.getDateTime()+" Administracion -> showHorarios() ex: "+ex.getMessage());
            request.setAttribute("msgError", UtilDate.getDateTime()+" Administracion -> showHorarios() Exception ex: "+ex.getMessage());
            PAGE = ERROR_PAGE;
        }finally{
            SqlManager.closeConexion(c);
        }
    }
    
    public void ofertaMaterias()throws DataException{// accion = 2 = muestra las materias a las q debe inscribirse
        Connection c = null;
        int idFacultad = Integer.parseInt(request.getParameter("idFacultad"));
        int idGestion = Integer.parseInt(request.getParameter("idGestion"));
        int idCarrera = Integer.parseInt(request.getParameter("idCarrera"));
        int codigoSis = s_Estudiante.getIdEstudiante();
        String nomFacultad = request.getParameter("nomFacultad");
        String nomCarrera = request.getParameter("nomCarrera");
        String codMatricula = request.getParameter("p1");
        
        session.setAttribute("s_myData", idGestion+"_"+idFacultad+"_"+nomFacultad+"_"+idCarrera+"_"+nomCarrera);
        
        List<Inscrito> inscritos = new ArrayList<Inscrito>();
        try{
            c = Conector.getConexion();
            MatriculaManager mmanager = ManagerFactory.getMatriculaManagerInstance(c);
            InscritoManager iManager = ManagerFactory.getInscritoManagerInstance(c);
            
            MateriaPensumManager mpmanager = ManagerFactory.getMateriaPensumManagerInstance(c);
            GrupoManager gManager = ManagerFactory.getGrupoManagerInstance(c);
            List<MateriaPensum> materiasOfertadas = mpmanager.getMateriasPropuestosPorEst(idGestion,idCarrera, codigoSis);
            List<Grupo> grupos = gManager.getGruposAllPorCarr(idGestion, idCarrera, true);
            
            if(mmanager.codigoValido(idGestion, codMatricula, idCarrera, codigoSis)){
                inscritos = iManager.getEstadoInscripcionBasic(idGestion, idCarrera, codigoSis);
                request.setAttribute("materiaPensumOfertadas", materiasOfertadas);
                request.setAttribute("grupos", grupos);
                request.setAttribute("inscritos", inscritos);//List<Inscrito>       
                PAGE = "WEB-INF/ESTUDIANTE/Inscripcion/mPropuestos.jsp";
            }else{
                msg = "C&oacute;digo incorrecto. Verifique!";
                request.setAttribute("msgMat", msg);
                this.indexInscripcion();
            }          
            
        }catch(DataException e){
            System.out.println(UtilDate.getDateTime()+" Error! Inscripciones -> ofertaMaterias() e: "+e.getMessage());
            request.setAttribute("msgError", UtilDate.getDateTime()+" Inscripciones -> ofertaMaterias() DataException "+e.getMessage());
            PAGE = ERROR_PAGE;
        }catch(Exception ex){
            System.out.println(UtilDate.getDateTime()+" Error! Inscripciones -> ofertaMaterias() ex: "+ex.getMessage());
            request.setAttribute("msgError", UtilDate.getDateTime()+" Inscripciones -> ofertaMaterias() Exception ex: "+ex.getMessage());
            PAGE = ERROR_PAGE;
        }finally{
            SqlManager.closeConexion(c);
        }
    }
    // <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">
    /** 
     * Handles the HTTP <code>GET</code> method.
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    /** 
     * Handles the HTTP <code>POST</code> method.
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    /** 
     * Returns a short description of the servlet.
     * @return a String containing servlet description
     */
    @Override
    public String getServletInfo() {
        return "Short description";
    }// </editor-fold>

    private void cerrarSessionEst(HttpServletRequest request, HttpServletResponse response) throws DataException {
        this.indexInscripcion();
        session = request.getSession(true);
        if(session.getAttribute("s_myData") != null){
            session.removeAttribute("s_myData");
        }
    }

    private void irAestadoDeInscripcion(int accion) throws DataException{// accion <-- 4; 8
        Connection c = null;       
        String[] myData = ((String)session.getAttribute("s_myData")).split("_");
          
        int idInscrito = 0;
        int idGestion = Integer.parseInt(myData[0]);
        int idCarrera = Integer.parseInt(myData[3]);
        int idGrupo = Integer.parseInt(request.getParameter("grupos"));
        int idPensum = Integer.parseInt(request.getParameter("idPensum"));
        int idMateria = Integer.parseInt(request.getParameter("idMateria"));
        int idEstudiante = s_Estudiante.getIdEstudiante();        
        
        try{
            c = Conector.getConexion();
            InscritoManager iManager = ManagerFactory.getInscritoManagerInstance(c);
            GrupoManager gManager = ManagerFactory.getGrupoManagerInstance(c);            
            List<Grupo> grupos = gManager.getGruposAllPorCarr(idGestion, idCarrera, true);
            idInscrito = iManager.getIdInscrito();            
            Inscrito i = new Inscrito();            
            i.setIdGestion(idGestion);
            i.setIdGrupo(idGrupo);
            i.setIdPensum(idPensum);
            i.setIdCarrera(idCarrera);
            i.setIdMateria(idMateria);
            i.setIdEstudiante(idEstudiante);
            i.setFecha(UtilDate.getDateTime());
            i.setT1(-1);
            i.setT2(-1);
            i.setT3(-1);
            i.setNota(-1);
            i.setSeg2(-1);
            i.setNf(-1);
            i.setAprobado(false);
            if(accion == 4){
                i.setIdInscrito(idInscrito);
                // para q no se inserte dos veces cuando hace f5
                boolean flag = false;
                List<Inscrito> inscritos = iManager.getEstadoInscripcionBasic(idGestion, idCarrera, idEstudiante);
                for(Inscrito in : inscritos )
                    if(in.getIdGestion() == i.getIdGestion() && in.getIdGrupo() == i.getIdGrupo() && in.getIdPensum() == i.getIdPensum() && in.getIdCarrera()== i.getIdCarrera() && in.getIdMateria()== i.getIdMateria() && in.getIdEstudiante()==i.getIdEstudiante())
                        flag = true;
                
                if(!flag)
                    iManager.saveInscrito(i);
            }else{
                i.setIdInscrito(Integer.parseInt(request.getParameter("idInscrito")));
                iManager.updateInscripto(i.getIdInscrito(), idGrupo);
            }
            
            request.setAttribute( "grupos", grupos );
            request.setAttribute("estadoInscripPorGest", iManager.getEstadoInscripPorGest(idGestion, idCarrera, idEstudiante) );//List<Inscrito>
            PAGE = "WEB-INF/ESTUDIANTE/Inscripcion/irAestadoInscripcion.jsp";         
            
        }catch(DataException e){
            System.out.println(UtilDate.getDateTime()+" Error! Inscripciones -> irAestadoDeInscripcion() e: "+e.getMessage());
            request.setAttribute("msgError", UtilDate.getDateTime()+" Inscripciones -> irAestadoDeInscripcion() DataException "+e.getMessage());
            PAGE = ERROR_PAGE;
        }catch(Exception ex){
            System.out.println(UtilDate.getDateTime()+" Error! Inscripciones -> irAestadoDeInscripcion() ex: "+ex.getMessage());
            request.setAttribute("msgError", UtilDate.getDateTime()+" Inscripciones -> irAestadoDeInscripcion() Exception ex: "+ex.getMessage());
            PAGE = ERROR_PAGE;
        }finally{
            SqlManager.closeConexion(c);
        }
    }

    private void ofertarMateriasDesdeIns() throws DataException{//accion <-- 5
        Connection c = null;
        session = request.getSession(true);        
        String[] aux = ((String)session.getAttribute("s_myData")).split("_");
        int idFacultad = Integer.parseInt(aux[1]);
        int idGestion = Integer.parseInt(aux[0]);
        int idCarrera = Integer.parseInt(aux[3]);
        int codigoSis = s_Estudiante.getIdEstudiante();
        String nomFacultad = aux[2];
        String nomCarrera = aux[4];       
        List<Inscrito> inscritos = new ArrayList<Inscrito>();
        try{
            c = Conector.getConexion();
            MatriculaManager mmanager = ManagerFactory.getMatriculaManagerInstance(c);
            InscritoManager iManager = ManagerFactory.getInscritoManagerInstance(c);            
            MateriaPensumManager mpmanager = ManagerFactory.getMateriaPensumManagerInstance(c);
            GrupoManager gManager = ManagerFactory.getGrupoManagerInstance(c);            
            List<MateriaPensum> materiasOfertadas = mpmanager.getMateriasPropuestosPorEst(idGestion,idCarrera, codigoSis);
            List<Grupo> grupos = gManager.getGruposAllPorCarr(idGestion, idCarrera, true);            
            inscritos = iManager.getEstadoInscripcionBasic(idGestion, idCarrera, codigoSis);// *****
            request.setAttribute("materiaPensumOfertadas", materiasOfertadas);
            request.setAttribute("grupos", grupos);            
            request.setAttribute("inscritos", inscritos);// para controlar desde el cliente *****            
            PAGE = "WEB-INF/ESTUDIANTE/Inscripcion/mPropuestos.jsp";            
            //isRedirect = false;            
        }catch(DataException e){
            System.out.println(UtilDate.getDateTime()+" Error! Inscripciones -> ofertarMateriasDesdeIns() e: "+e.getMessage());
            request.setAttribute("msgError", UtilDate.getDateTime()+" Inscripciones -> ofertarMateriasDesdeIns() DataException "+e.getMessage());
            PAGE = ERROR_PAGE;
        }catch(Exception ex){
            System.out.println(UtilDate.getDateTime()+" Error! Inscripciones -> ofertarMateriasDesdeIns() ex: "+ex.getMessage());
            request.setAttribute("msgError", UtilDate.getDateTime()+" Inscripciones -> ofertarMateriasDesdeIns() Exception ex: "+ex.getMessage());
            PAGE = ERROR_PAGE;
        }finally{
            SqlManager.closeConexion(c);
        }
    }

    private void irAestadoDeInscripcionDesdeOfer() throws DataException{//accion <-- 6
        Connection c = null;        
        String[] myData = ((String)session.getAttribute("s_myData")).split("_");
        int idInscrito = 0;
        int idGestion = Integer.parseInt(myData[0]);
        int idCarrera = Integer.parseInt(myData[3]);
        int idEstudiante = s_Estudiante.getIdEstudiante();
        
        try{
            c = Conector.getConexion();
            InscritoManager iManager = ManagerFactory.getInscritoManagerInstance(c);
            GrupoManager gManager = ManagerFactory.getGrupoManagerInstance(c);            
            List<Grupo> grupos = gManager.getGruposAllPorCarr(idGestion, idCarrera, true);
            request.setAttribute( "grupos", grupos );            
            request.setAttribute("estadoInscripPorGest", iManager.getEstadoInscripPorGest(idGestion, idCarrera, idEstudiante) );//List<Inscrito>
            PAGE = "WEB-INF/ESTUDIANTE/Inscripcion/irAestadoInscripcion.jsp";           
            
        }catch(DataException e){
            System.out.println(UtilDate.getDateTime()+" Error! Inscripciones -> irAestadoDeInscripcionDesdeOfer() e: "+e.getMessage());
            request.setAttribute("msgError", UtilDate.getDateTime()+" Inscripciones -> irAestadoDeInscripcionDesdeOfer() DataException "+e.getMessage());
            PAGE = ERROR_PAGE;
        }catch(Exception ex){
            System.out.println(UtilDate.getDateTime()+" Error! Inscripciones -> irAestadoDeInscripcionDesdeOfer() ex: "+ex.getMessage());
            request.setAttribute("msgError", UtilDate.getDateTime()+" Inscripciones -> irAestadoDeInscripcionDesdeOfer() Exception ex: "+ex.getMessage());
            PAGE = ERROR_PAGE;
        }finally{
            SqlManager.closeConexion(c);
        }
    }

    private void estadoDeInscripcionAjax() throws DataException{// accion <-- 7
        
        Connection c = null;
        String[] myData = ((String)session.getAttribute("s_myData")).split("_");
        int idInscrito = Integer.parseInt(request.getParameter("idInscrito"));
        int idGestion = Integer.parseInt(myData[0]);
        int idCarrera = Integer.parseInt(myData[3]);
        int idEstudiante = s_Estudiante.getIdEstudiante();
        String nombreMateria = request.getParameter("nombreMateria");
        
        try{
            c = Conector.getConexion();
            InscritoManager iManager = ManagerFactory.getInscritoManagerInstance(c);
            iManager.deleteInscrito(idInscrito);            
            request.setAttribute("estadoInscripPorGest", iManager.getEstadoInscripPorGest(idGestion, idCarrera, idEstudiante) );//List<Inscrito>
            PAGE = "WEB-INF/ESTUDIANTE/Inscripcion/estadoInscripcionAjax.jsp";
            
        }catch(DataException e){
            System.out.println(UtilDate.getDateTime()+" Error! Inscripciones -> estadoDeInscripcionAjax() e: "+e.getMessage());
            request.setAttribute("msgError", UtilDate.getDateTime()+" Inscripciones -> estadoDeInscripcionAjax() DataException "+e.getMessage());
            PAGE = ERROR_PAGE;
        }catch(Exception ex){
            System.out.println(UtilDate.getDateTime()+" Error! Inscripciones -> estadoDeInscripcionAjax() ex: "+ex.getMessage());
            request.setAttribute("msgError", UtilDate.getDateTime()+" Inscripciones -> estadoDeInscripcionAjax() Exception ex: "+ex.getMessage());
            PAGE = ERROR_PAGE;
        }finally{
            SqlManager.closeConexion(c);
        }
    }   
}
